// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
//AccessToken
// const {WXMINIUser,WXMINIMessage}=require('wx-js-utils');
// const appid='wxb76f373c12ccf84d'
// const secret='05fc015aea8744c45faa254e010beabd'
//引入时间方法
const times = require("time")
//采用MQTT协议
const mqtt = require('mqtt')
const connect = mqtt.connect
//服务器接口
const MqttConnect = 'ws://stm32.mqtt-8266.xyz:8083/mqtt'

// 云函数入口函数
exports.main = async (event, context) => {
  console.log('已进入云函数')
  var client= connect(MqttConnect)
  //需要用到的变量定义
  let time = times.formatTime(new Date())//获取时间字符串
  let local_time1,local_time2,local_time3//获取数据库用户设置的时间
  let operation1,operation2,operation3   //操作数据缓存
  
  console.log('time:',time)

  time= time.replace(/[^0-9]/ig,"");     //正则表达式，只留数字字符
  time=parseInt(time,10)                //字符串转10进制
  console.log('数字时间',time)

  return await db.collection('timer').get().then(res=>{
    //Step1:从数据库拉取数据并整理local_time数据和operation数据
    local_time1=100*(res.data[0].timeObject.hour)+(res.data[0].timeObject.min)
    local_time2=100*(res.data[1].timeObject.hour)+(res.data[1].timeObject.min)
    local_time3=100*(res.data[2].timeObject.hour)+(res.data[2].timeObject.min)

    console.log('local_time1:',local_time1)
    console.log('local_time2:',local_time2)
    console.log('local_time3:',local_time3)

    operation1=res.data[0].operation
    operation2=res.data[1].operation
    operation3=res.data[2].operation

    console.log('operation1:',operation1)
    console.log('operation2:',operation2)
    console.log('operation3:',operation3)

    //Step2:软件定时器每分钟执行一次,再轮询检查（左开右闭）
    if((time==local_time1)||(time==(local_time1+1))||(time==local_time2)||(time==(local_time2+1))||(time==local_time3)||(time==(local_time3+1)))
    {
      //Step3:连上MQTT服务器
      client.on('connect', function() {
  
      client.subscribe("SmartHome", function (err) {
      if (!err) {
        console.log("云函数成功连上MQTT服务器！")
        console.log("云函数成功订阅了SmartHome主题")
     //Step4:先看设置1的时间是否到了
        if((time==local_time1)||(time==(local_time1+1)))
        {
          //发布键值对
            client.publish('SmartHome', JSON.stringify({Settings:operation1}), function (err) {
            if (!err)
            {
            console.log("已发送用户设置1操作数据")
            }
            else
            {
            console.log("用户设置1发布失败")
            }
          })
        }
      //Step5:再看设置2的时间是否到了
        if((time==local_time2)||(time==(local_time2+1)))
        {
          //发布键值对
          client.publish('SmartHome', JSON.stringify({Settings:operation2}), function (err) {
           if (!err)
           {
            console.log("已发送用户设置2操作数据")
           }
           else
           {
            console.log("用户设置2发布失败")
           }
         })
        }
       //Step6:最后看设置3的时间是否到了
        if((time==local_time3)||(time==(local_time3+1)))
        {
          //发布键值对
            client.publish('SmartHome', JSON.stringify({Settings:operation3}), function (err) {
            if (!err)
            {
              console.log("已发送用户设置3操作数据")
            }
            else
            {
              console.log("用户设置3发布失败")
            }
          })
        }
      }
      else
      {
        console.log("严重错误:订阅主题失败！")
      }
      })
    })
    //Step7:结束轮询调查,主动断开连接,让出总线
    client.end() 
   }
   else
   {
    console.log("没有符合条件的时间设置")
   }
 })
}